"""
自制一个密码生成器
"""
import string
import secrets


################################################# >>>指定密码的字母、数字和符号的范围<<< #################################################
letters = string.ascii_letters # 生成所有字母
numbers = string.digits # 生成所有数字
symbols = string.punctuation # 生成所有符号

################################################# >>>用输入指定密码的字母、数字和符号的个数<<< #################################################
num_letters = int(input("请指定密码中包含字母的个数：")) # 指定密码中包含字母的个数
num_numbers = int(input("请指定密码中包含数字的个数：")) # 指定密码中包含数字的个数
num_symbols = int(input("请指定密码中包含符号的个数：")) # 指定密码中包含符号的个数

################################################# >>>生成密码的字母、数字和符号的随机<<< #################################################
temp_letters = (secrets.choice(letters) for _ in range(num_letters)) # 生成指定个数的字母(生成器推导式)
temp_numbers = (secrets.choice(numbers) for _ in range(num_numbers)) # 生成指定个数的数字(生成器推导式)
temp_symbols = (secrets.choice(symbols) for _ in range(num_symbols)) # 生成指定个数的符号(生成器推导式)

result = "".join(temp_letters) + "".join(temp_numbers) + "".join(temp_symbols) # 将生成的字母、数字和符号连接起来，最后赋值给一个变量类型为字符串
final_password = list(result) # 将字符串类型转换为列表类型
secrets.SystemRandom().shuffle(final_password) # 将生成的密码打乱顺序

my_password = "".join(final_password) # 将打乱顺序的密码转换为字符串类型
print(my_password) # 打印生成的密码